/**
 * 该文件已被废弃，路由文件已使用类的装饰器自动生成的路由文件
 */
import fs from "fs";
import path from "path";
// 引入的 { Request, Response } from 'express' 为 Request 和 Response 两个类型注解
import { Router, Request, Response, NextFunction } from "express";
// 引入爬虫
import Crowller from "./utils/crowller";
// 引入分析器
import LycAnalyzer from "./utils/analyzer";
import { getResponseData } from "./utils/util";

// express 库的问题：
// 问题1：express 库的类型定义文件 .d.ts 文件类型描述不准确
// 问题解决：
interface bodyRequest extends Request {
  // bodyRequest 继承了 Request 类型注解以外还增加了自己的属性
  body: {
    // 泛匹配，只要键名为字符串，键值为 string | undefined 都可以
    [key: string]: string | undefined;
  };
}

// 自己编写登录权限校验的中间件
const checkLogin = (req: bodyRequest, res: Response, next: NextFunction) => {
  const isLogin = req.session ? req.session.login : false;
  if (isLogin) {
    next();
  } else {
    // 返回标准接口定义的数据类型
    res.json(getResponseData(null, `请先登录`));
  }
};

// 定义路由
const router = Router();

router.get("/", (req: bodyRequest, res: Response) => {
  const isLogin = req.session ? req.session.login : false;
  if (isLogin) {
    res.send(`
    <html>
      <body>
        <a href="/getData">爬取内容</a>
        <a href="/showData">展示内容</a>
        <a href="/logout">退出</a>
      </body>
    </html>
    `);
  } else {
    res.send(`
    <html>
      <body>
        <form method="post" action="/login">
          <input type="password" name="password" />
          <button>登录</button>
        </form>
      </body>
    </html>
    `);
  }
});

router.post("/login", (req: bodyRequest, res: Response) => {
  // 因为在 index.ts 文件内使用了 body-parser 中间件，所以可以直接使用 req.body 请求体信息
  const { password } = req.body;
  // 是否已经登录过标识
  const isLogin = req.session ? req.session.login : false;
  if (isLogin) {
    res.json(getResponseData(false, `已经登录过`));
  } else {
    // 类型保护，如果使用了 cookie-session 则存在 req.session，如果 req.session 存在才设置为 true
    if (password === "123" && req.session) {
      req.session.login = true;
      res.json(getResponseData(true));
    } else {
      res.json(getResponseData(false, `登录失败`));
    }
  }
});

router.get("/logout", (req: bodyRequest, res: Response) => {
  if (req.session) {
    req.session.login = undefined;
  }
  res.json(getResponseData(true));
});

// router.get 方法传入的第二个参数 checkLogin 为中间件，意思是进入 /getData 路由后，会先执行中间件的判断然后再走之后编写的业务逻辑
router.get("/getData", checkLogin, (req: bodyRequest, res: Response) => {
  const url = `https://www.imooc.com/`;
  const analyzer = LycAnalyzer.getInstance();
  new Crowller(url, analyzer);
  res.json(getResponseData(true));
});

// router.get 方法传入的第二个参数 checkLogin 为中间件，意思是进入 /showData 路由后，会先执行中间件的判断然后再走之后编写的业务逻辑
router.get("/showData", checkLogin, (req: bodyRequest, res: Response) => {
  try {
    const position = path.resolve(__dirname, "../data/course.json");
    const result = fs.readFileSync(position, "utf-8");
    res.json(getResponseData(JSON.parse(result)));
  } catch (e) {
    res.json(getResponseData(false, `数据不存在`));
  }
});
// 导出路由
export default router;
